package com.google.code.memoriesalbum.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.apache.commons.collections.CollectionUtils;

import com.google.gdata.client.authn.oauth.OAuthException;
import com.google.gdata.client.calendar.CalendarService;
import com.google.gdata.data.calendar.CalendarEntry;
import com.google.gdata.data.calendar.CalendarFeed;
import com.google.gdata.util.ServiceException;

/**
 * Calendarサービス用のユーティリティクラス。
 * <p>Calendarサービスを使って、トークンの組み合わせに対応するユーザID（メールアドレス）を取得したい。</p>
 * @author shin1ogawa
 */
public class CalendarUtil {

	static final Logger logger = Logger.getLogger(CalendarUtil.class.getName());


	private CalendarUtil() {
	}

	/**
	 * トークンの組み合わせに対応するユーザのメールアドレスを返す。
	 * @param token アクセストークン
	 * @param tokenSecret トークンシークレット
	 * @return トークンの組み合わせに対応するユーザのメールアドレス。<br />
	 * 	カレンダがひとつも存在しない時や取得できなかった時は{@code null}.
	 * @throws MalformedURLException
	 * @throws ServiceException
	 * @throws OAuthException トークンの組み合わせが不正な場合。
	 * @throws UnsupportedEncodingException 
	 */
	public static String getUserEmailViaCalendarService(String token, String tokenSecret)
			throws MalformedURLException, ServiceException, OAuthException,
			UnsupportedEncodingException {
		CalendarService service = new CalendarService(Constants.APPLICATION_NAME);
		PicasaUtil.setOAuthCredentials(service, token, tokenSecret);
		String urlString = "http://www.google.com/calendar/feeds/default/allcalendars/full";
		service.setConnectTimeout(4800);
		service.setReadTimeout(4800);
		CalendarFeed feed = null;
		for (int i = 1; i <= 5; i++) { // Timeoutしやすいので、リトライを行う。
			try {
				feed = service.getFeed(new URL(urlString), CalendarFeed.class);
				break;
			} catch (ServiceException e) {
				// retry
				logger.log(Level.INFO, "リトライを行います:" + i + "回目");
			} catch (IOException e) {
				// retry
				logger.log(Level.INFO, "リトライを行います:" + i + "回目");
			}
		}
		if (feed == null) {
			return null;
		}
		List<CalendarEntry> entries = feed.getEntries();
		if (CollectionUtils.isEmpty(entries)) {
			return null;
		}
		CalendarEntry calendarEntry = entries.get(0);
		String id = calendarEntry.getId();
		int pos = id.lastIndexOf('/');
		return URLDecoder.decode(id.substring(pos + 1), "utf-8");
	}
}
